{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**通用最佳实践回顾**\n",
    "\n",
    "- `std::multimap<Key, T>` 与 `std::map` 相同保持键的严格弱序，但允许同一键存放多个值，非常适合倒排索引、事件广播、HTTP 同名头部、多实例聚类等“多值”场景。\n",
    "- 典型操作使用 `equal_range`、`lower_bound`、`upper_bound` 高效枚举同键值范围；插入/查找复杂度为 `O(log n)`，遍历同键区间通常是连续的，有助于顺序访问。\n",
    "- 插入不会使迭代器失效；删除仅影响被移除元素。批量删除某键范围时优先使用 `erase(range)` 或 `erase(it)` 的返回值以保证迭代安全。\n",
    "- 通过 `emplace`/`try_emplace`（C++17 起无 `try_emplace`，使用 `emplace_hint` 优化）减少冗余构造；C++17 以后可以借助 node handle (`extract`) 调整键或迁移节点。\n",
    "- 在读多写少、键类别有限的场景，可对比 `std::unordered_multimap`、`std::map<Key, std::vector<T>>` 等替代数据结构；必要时引入自定义比较器实现大小写无关或前缀排序。\n",
    "- 注意多值遍历顺序：默认按键排序且同键按插入顺序；若需稳定自定义次序，可在 value 部分包含时间戳或序号并结合稳定排序逻辑。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| 序号 | 工程场景                    | 文件名                         | 说明要点                                                     | 可运行示例代码             |\n",
    "| ---- | --------------------------- | ------------------------------ | ------------------------------------------------------------ | -------------------------- |\n",
    "| 1    | 倒排索引（term → postings） | `multimap_inverted_index.cpp`  | 同一关键词映射多篇文档；`equal_range` 快速枚举命中列表       | 示例 1：倒排索引查询       |\n",
    "| 2    | 事件/信号的多监听者注册表   | `multimap_event_dispatch.cpp`  | 一个事件键对应多个监听器；插入不致迭代器失效，分发时安全遍历 | 示例 2：事件监听广播       |\n",
    "| 3    | 多值参数/HTTP 头部同名键    | `multimap_http_headers.cpp`    | 通过 `equal_range` 提取同名头部；保持头部原始顺序；展示如何增删同键条目 | 示例 3：HTTP 头部多值处理  |\n",
    "| 4    | 数据聚类下的键到多实例映射  | `multimap_cluster_members.cpp` | 聚类编号映射多实例；`extract` + `insert` 调整节点；利用范围遍历导出聚类成员 | 示例 4：聚类成员访问与迁移 |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 示例 1：倒排索引查询（multimap_inverted_index.cpp）\n",
    "- 示例 2：事件监听广播（multimap_event_dispatch.cpp）\n",
    "- 示例 3：HTTP 头部多值处理（multimap_http_headers.cpp）\n",
    "- 示例 4：聚类成员访问与迁移（multimap_cluster_members.cpp）"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "name": "C++17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
